package com.hzit.proxy.dynamic;

import com.hzit.UserDao;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 类名：
 * 作者：WF
 * 功能：
 * 方式一：使用JDK的InvocationHandler接口与Proxy类实现 (使用的是目标对象的接口生成代理对象)
 */
public class UserDaoJDKDynamicProxy implements InvocationHandler {
	private UserDao userDao;
	public UserDaoJDKDynamicProxy(UserDao userDao){
		this.userDao = userDao;
	}

	/**
	 *  1. 生成代表对象(根据目标对象生成代理对象)
	 */
	public UserDao createProxy(){
		/**
		 * 参数1： classLoader: 目标对象的类加载器
		 * 参数2： 目标对象所实现的接口数组类型
		 * 参数3： 代表实现了InvocationHandler接口的对象
		 */
		Object o = Proxy.newProxyInstance(
				userDao.getClass().getClassLoader(),
				userDao.getClass().getInterfaces(), this);
		return (UserDao) o;
	}

	/**
	 * 2. 当我们调用目标对象的方法时，此方法会自动调用
	 * @param proxy: 代表代理对象
	 * @param method: 代表要调用的方法
	 * @param args: 代表调用方法传递的参数
	 */
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		if(method.getName().equals("query")){
			checkSecurity();
		}
		Object result = method.invoke(userDao, args);
		return result;
	}

	private void checkSecurity(){
		System.out.println("[JDK动态代理]正在进行安全性检查。。。");
	}

}
